#include "ResearchWindow.h"
#include "ArbrCar.h"
#include <iostream>
#include <sstream>
#include "DestrAbre2.h"
#include "structures.h"
#include "RehercheSequentiel.h"
#include "Bienvenue.h"
#include "RechPO.h"
#include <time.h>
#include "compress.h"
#include <QComboBox>
#include <QString>
#include "mainwindowimpl.h"
using namespace std;

ResearchWindow::ResearchWindow( QWidget * parent, Qt::WFlags f) : QMainWindow(parent, f)
{
	
	setupUi(this);
	
}
void ResearchWindow::setArbre(dico2 *arbre){
	this->Racine=arbre;
	}
void ResearchWindow::titre()
{
	
	string sl;int i=0;
	while(genome[i]!='$' && i<12)
	{
		sl = sl + genome[i];
		i++;	
	}
	sl = sl + genome[i];
	if(i<12)
	{
		
		
		label->setText(sl.c_str());
	}
	else
	{
		string ssl="";
		for(int i = 0 ; i < 8 ; i++)
		{
			ssl=ssl+sl[i];	
		}
		ssl=ssl+"...";
		
		label->setText(ssl.c_str());
		
	}
}
void ResearchWindow::setChaine(char* chaine){
	this->genome=chaine;
	}
void ResearchWindow::getTreeInformations()
{
		QString nb="",taille="";
		string a;
		stringstream *out = new stringstream;
		*out << NbNoeud(Racine);
		a = out->str();
		delete out;
		nb = QString(a.c_str());
		out = new stringstream;
		*out << Longueur(Racine);
		a = out->str();
		taille = QString(a.c_str());
	QMessageBox::critical(this, "Informations", "L'arbre dispose de "+nb+" Noeuds et sa longueur maximum est de "+taille+" noeuds !");
}
ResearchWindow::~ResearchWindow()
{
	supprimerArbre2(Racine);
	free(genome);
}
void ResearchWindow::Quitter()
{
	
	supprimerArbre2(Racine);
	free(genome);
	this->close();
	
	}
	void ResearchWindow::aide()
	{
		QMessageBox::critical(this, "Informations", "L'interface MenuPrincipal vous permet d'acceder a un menu de recherche,\n de sauvegarder la chaine dans un fichier txt ou de la compresser dans un fichier dicosu. Vous pouvez egalement retourner au menu initial sans fermer cette fenetre et reencoder une autre chaine; cela creera une nouvelle fenetre de ce type");
		}
void ResearchWindow::sauvegarder()
{
	QString fichier="";
	 fichier = QFileDialog::getSaveFileName(this, "Enregistrer un fichier", QString(), "texte (*.txt)");
	if(fichier!="")
	{
	
		if(!(fichier[fichier.length()-4]=='.' && fichier[fichier.length()-1]=='t' && fichier[fichier.length()-2]=='x'))
			fichier = fichier + ".txt";
		enregistre(genome,(char*)fichier.toStdString().c_str());	
		QMessageBox::critical(this, "Compression", "Fichier enregistre !");
		
	
	}
	
	
}
void ResearchWindow::Compresser()
{
	QString fichier="";
	 fichier = QFileDialog::getSaveFileName(this, "Enregistrer un fichier", QString(), "dicosu (*.dicosu)");
	if(fichier!="")
	{
	
		if(!(fichier[fichier.length()-7]=='.' && fichier[fichier.length()-3]=='o' && fichier[fichier.length()-1]=='u'))
			fichier = fichier + ".dicosu";
		compress(genome,Racine,(char*)fichier.toStdString().c_str(),progressBar);
		QMessageBox::critical(this, "Compression", "Fichier compresse !");
		progressBar->setValue(0);
	}
}
void ResearchWindow::recherche()
{bool ok;dico2* noeud;int oc=0,nb=0;noeud=Racine;QString a,b;
	if(comboBox->currentIndex ()==1)
	{
    QString recherche = QInputDialog::getText(this, "Fichier", "Veuillez ecrire la chaine en utilisant exclusivement les lettres a, t , c et g et en terminant par un $", QLineEdit::Normal, QString(), &ok);
	if( ok && recherche!="")
	{
		if(bien((char*)recherche.toStdString().c_str()))
		{
			
			oc=Rech27(noeud,(char*)recherche.toStdString().c_str(),genome,&nb);
			if(oc>0)
			{
				stringstream *out = new stringstream;
				*out << oc;
				
				a = QString(out->str().c_str());
				delete out;
				out = new stringstream;
				*out << nb;
				b = QString(out->str().c_str());
				delete out;
				QMessageBox::critical(this, "Recherche", "La sequence est presente "+b+" fois et sa premiere occurence est a la "+a+" positions !");
			}
			else
				QMessageBox::critical(this, "Recherche", "La chaine n'est pas presente dans le genome...");
		}
		else
		{
			QMessageBox::critical(this, "Erreur", "Vous avez fait une erreur lors de l'ecriture de la chaine : "+recherche);
		}
	}
	}
	else if (comboBox->currentIndex ()==3 )
	{
		
			char* genome2=NULL;FILE* fichier2 = NULL;
			QString fichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier et le decompresser", QString(), "DicoSu (*.dicosu)");
			 if(fichier!="")
			{
				fichier2 = fopen((char*)fichier.toStdString().c_str(), "r");
 
    			if (fichier2 != NULL)
    			{
					genome2 = decompress(fichier2);
					oc=Rech27(noeud,genome2,genome,&nb);
			
					if(oc>0)
					{
						stringstream *out = new stringstream;
						*out << oc;
				
						a = QString(out->str().c_str());
						delete out;
						out = new stringstream;
						*out << nb;
						b = QString(out->str().c_str());
						delete out;
						QMessageBox::critical(this, "Recherche", "La sequence est presente "+b+" fois et sa premiere occurence est a la "+a+" positions !");
					}
					else
						QMessageBox::critical(this, "Recherche", "La chaine n'est pas presente dans le genome...");
				}
			}
		}
	
		else if(comboBox->currentIndex ()==2)
		{
			
			char* genome2=NULL;
			QString fichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Texte (*.txt)");
			 if(fichier!="")
			{
				
					genome2 = RecupChaine((char*)fichier.toStdString().c_str());
					oc=Rech27(noeud,genome2,genome,&nb);
			
					if(oc>0)
					{
						stringstream *out = new stringstream;
						*out << oc;
				
						a = QString(out->str().c_str());
						delete out;
						out = new stringstream;
						*out << nb;
						b = QString(out->str().c_str());
						delete out;
						QMessageBox::critical(this, "Recherche", "La sequence est presente "+b+" fois et sa premiere occurence est a la "+a+" positions !");
					}
					else
						QMessageBox::critical(this, "Recherche", "La chaine n'est pas presente dans le genome...");
				
			}
		}
		comboBox->setCurrentIndex (0);
		
}
void ResearchWindow::affiche()
{
	fen = new AffichageChaine();
	fen->show();
	fen->setText(qgenome);
	
}
void ResearchWindow::performance()
{
	bool ok;QString a,b;int oc,nb;dico2 *noeud=Racine;
	clock_t debut,fin;float temps1,temps2;
	QString recherche = QInputDialog::getText(this, "Fichier", "Veuillez ecrire la chaine en utilisant exclusivement les lettres a, t , c et g et en terminant par un $", QLineEdit::Normal, QString(), &ok);
	if( ok && recherche!="")
	{
		if(bien((char*)recherche.toStdString().c_str()))
		{
			debut = clock ();
			oc=Rech27(noeud,(char*)recherche.toStdString().c_str(),genome,&nb);
			fin = clock ();
			temps1= (fin -debut );
			if(!temps1)
				temps1=1;
			debut = clock ();
			rech09(genome,(char*)recherche.toStdString().c_str(),progressBar);
			fin = clock ();
			temps2= (fin -debut );
			if(!temps2)
				temps2=1;
			stringstream *out = new stringstream;QString z,e,r;
			if(oc>0)
			{
				
				*out << oc;
				
				a = QString(out->str().c_str());
				delete out;
				out = new stringstream;
				*out << nb;
				b = QString(out->str().c_str());
				
				
				QMessageBox::critical(this, "Performance", "La sequence est presente "+b+" fois et sa premiere occurence est a la "+a+" positions !");
				}
			else
				QMessageBox::critical(this, "Performance", "La chaine n'est pas presente dans le genome...");
			delete out;
			out = new stringstream;
			*out << temps1/CLOCKS_PER_SEC;
			z = QString(out->str().c_str());
			delete out;
			out = new stringstream;
			*out << temps2/CLOCKS_PER_SEC;
			e = QString(out->str().c_str());
			delete out;
			out = new stringstream;
			*out << (temps2/temps1);
			r = QString(out->str().c_str());
			delete out;
			QMessageBox::critical(this, "Performance", "L'algorithme de recherche sequentiel a mis "+e+" secondes a trouver");
			QMessageBox::critical(this, "Performance", "L'algorithme de recherche dans l'arbre a mis "+z+" secondes a trouver");
			QMessageBox::critical(this, "Performance", "L'algorithme de recherche dans l'arbre a donc ete "+r+" fois plus rapide");
			
		}
		else
		{
			QMessageBox::critical(this, "Erreur", "Vous avez fait une erreur lors de l'ecriture de la chaine : "+recherche);
		}
	}
}
void ResearchWindow::setqgenome(QString a)
{
	this->qgenome=a;
	if(qgenome.length()>50000)
	{
		plainTextEdit->hide();
		M_1->show();
		M_2->show();
	}
	else
	plainTextEdit->setPlainText(qgenome);
}
void ResearchWindow::save()
{
	if(comboBox_2->currentIndex()==1)
	{
		this->sauvegarder();
	}
	else if(comboBox_2->currentIndex()==2)
	{
		this->Compresser();
	}
	comboBox_2->setCurrentIndex (0);
}
